/**
 * 将源对象的值合并到目标对象中，仅更新目标对象已有的属性
 * @param targetObj 目标对象（将被修改）
 * @param sourceObj 源对象（提供更新值）
 * @returns 更新后的目标对象
 */
export const updateObj = <T extends Record<string, any>>(
  targetObj: T,
  sourceObj: Partial<T>,
): T => {
  // 获取目标对象的所有键
  const targetKeys = Object.keys(targetObj) as Array<keyof T>;

  targetKeys.forEach((key) => {
    // 仅当源对象存在相同键时才更新
    if (sourceObj.hasOwnProperty(key)) {
      targetObj[key] = sourceObj[key] as T[keyof T];
    }
  });

  return targetObj;
};

export const getUUID = () => {
  let random;
  let uuid = "";
  for (let i = 0; i < 32; i++) {
    random = (Math.random() * 16) | 0; // 解释1
    if (i === 8 || i === 12 || i === 16 || i === 20) {
      // 解释2
      uuid += "-";
    }
    uuid += (i === 12 ? 4 : i === 16 ? (random & 3) | 8 : random).toString(16); // 解释3
  }
  return uuid;
};
